package org.bapoint.bawirelessprogressusercenter.entity.enums;

/**
 * HTTP 状态码枚举类
 * 适用于 RESTful API 返回、全局异常处理等场景
 */
public enum HttpStatusEnum {

    // -------------------- 2xx 成功 --------------------
    OK(200, "成功"),
    CREATED(201, "资源创建成功"),
    ACCEPTED(202, "请求已接受，正在处理"),
    NO_CONTENT(204, "成功，但无返回内容"),

    // -------------------- 3xx 重定向 --------------------
    MOVED_PERMANENTLY(301, "永久重定向"),
    FOUND(302, "临时重定向"),
    SEE_OTHER(303, "查看其他资源"),
    NOT_MODIFIED(304, "资源未修改，可使用缓存"),

    // -------------------- 4xx 客户端错误 --------------------
    BAD_REQUEST(400, "请求参数错误"),
    UNAUTHORIZED(401, "未授权，请登录"),
    FORBIDDEN(403, "禁止访问，权限不足"),
    NOT_FOUND(404, "请求资源不存在"),
    METHOD_NOT_ALLOWED(405, "请求方法不支持"),
    REQUEST_TIMEOUT(408, "请求超时"),
    CONFLICT(409, "请求冲突，资源状态不符"),
    UNSUPPORTED_MEDIA_TYPE(415, "不支持的媒体类型"),
    TOO_MANY_REQUESTS(429, "请求过于频繁，请稍后再试"),

    // -------------------- 5xx 服务端错误 --------------------
    INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
    NOT_IMPLEMENTED(501, "功能未实现"),
    BAD_GATEWAY(502, "网关错误"),
    SERVICE_UNAVAILABLE(503, "服务不可用，可能正在维护"),
    GATEWAY_TIMEOUT(504, "网关超时");

    private final int code;
    private final String message;

    HttpStatusEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    /**
     * 根据状态码获取枚举值
     * @param code 状态码
     * @return 对应的枚举，若无匹配则返回 INTERNAL_SERVER_ERROR
     */
    public static HttpStatusEnum fromCode(int code) {
        for (HttpStatusEnum status : HttpStatusEnum.values()) {
            if (status.getCode() == code) {
                return status;
            }
        }
        return INTERNAL_SERVER_ERROR;
    }

    /**
     * 是否为成功状态（2xx）
     */
    public boolean isSuccess() {
        return this.code >= 200 && this.code < 300;
    }

    /**
     * 是否为客户端错误（4xx）
     */
    public boolean isClientError() {
        return this.code >= 400 && this.code < 500;
    }

    /**
     * 是否为服务端错误（5xx）
     */
    public boolean isServerError() {
        return this.code >= 500 && this.code < 600;
    }

    @Override
    public String toString() {
        return "HttpStatus{" +
                "code=" + code +
                ", message='" + message + '\'' +
                '}';
    }
}